package 行为型模式.访问者模式;

import java.util.ArrayList;
import java.util.List;

/**
 * 主要组成部分
 * Visitor (访问者): 声明了一组访问操作，每个操作对应一个具体元素类
 * ConcreteVisitor (具体访问者): 实现Visitor声明的操作
 * Element (元素): 定义一个accept方法，接受一个访问者对象
 * ConcreteElement (具体元素): 实现accept方法
 * ObjectStructure (对象结构): 能够枚举它的元素，可以提供一个高层接口允许访问者访问它的元素
 */
// 访问者接口
interface IVisitor {
	void visit(ConcreteElementA element);
	void visit(ConcreteElementB element);
}

// 具体访问者
class ConcreteVisitor implements IVisitor {
	@Override
	public void visit(ConcreteElementA element) {
		System.out.println("Visitor is processing ElementA");
	}

	@Override
	public void visit(ConcreteElementB element) {
		System.out.println("Visitor is processing ElementB");
	}
}

// 元素接口
interface Element {
	void accept(IVisitor visitor);
}

// 具体元素A
class ConcreteElementA implements Element {
	@Override
	public void accept(IVisitor visitor) {
		visitor.visit(this);
	}
}

// 具体元素B
class ConcreteElementB implements Element {
	@Override
	public void accept(IVisitor visitor) {
		visitor.visit(this);
	}
}

// 对象结构
class ObjectStructure {
	private List<Element> elements = new ArrayList<>();

	public void add(Element element) {
		elements.add(element);
	}

	public void accept(IVisitor visitor) {
		for (Element element : elements) {
			element.accept(visitor);
		}
	}
}

public class Visitor 
{
	public static void main(String[] args) {
		ObjectStructure structure = new ObjectStructure();
		structure.add(new ConcreteElementA());
		structure.add(new ConcreteElementB());

		IVisitor visitor = new ConcreteVisitor();
		structure.accept(visitor);
	}
}
